// LadderLineChartView.hpp

#ifndef LADDERLINECHARTVIEW_HPP
#define LADDERLINECHARTVIEW_HPP

#include <QWidget>
#include <QScrollArea>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QLabel>
#include <QDebug>
#include "assembly/widget/PartsLadderLineWidget.hpp"
#include "assembly/viewmodel/LadderLineChartViewModel.hpp"

QT_CHARTS_USE_NAMESPACE

class LadderLineChartView : public QWidget {
    Q_OBJECT

public:
    // 构造函数
    LadderLineChartView(QWidget *parent = nullptr)
        : QWidget(parent),
          viewModel(new LadderLineChartViewModel(this)),
          scrollArea(new QScrollArea(this)),
          contentWidget(new QWidget()) {
        oViewUI();
        oConnections();
    }

    // 析构函数
    ~LadderLineChartView() override = default;

protected:
    void paintEvent(QPaintEvent *event) override {
        QWidget::paintEvent(event);
    }

    void resizeEvent(QResizeEvent *event) override {
        QWidget::resizeEvent(event);
        updateChart();  // 根据需求决定是否在调整大小时更新图表
    }

private:
    void oViewUI() {
        // 初始化布局
        QVBoxLayout *mainLayout = new QVBoxLayout(this);
        mainLayout->setSpacing(0);  // 可选：设置控件之间的间距
        mainLayout->setContentsMargins(0, 0, 0, 0);  // 可选：设置布局的边距

        // 配置 QScrollArea
        scrollArea->setWidgetResizable(true); // 使内容窗口随滚动区域大小调整
        scrollArea->setWidget(contentWidget); // 设置内容窗口

        // 初始化内容窗口的布局
        layout = new QVBoxLayout(contentWidget);
        layout->setSpacing(0);  // 可选：设置控件之间的间距
        layout->setContentsMargins(0, 0, 0, 0);  // 可选：设置布局的边距
        layout->addStretch();  // 添加弹簧项，将控件推到顶部

        // 将滚动区域添加到主布局
        mainLayout->addWidget(scrollArea); // 将滚动区域添加到主布局
        setLayout(mainLayout);
    }

    void oConnections() {
        // 连接视图模型的信号到更新图表的槽
        connect(viewModel, &LadderLineChartViewModel::startTimeChanged, this, &LadderLineChartView::updateChart, Qt::UniqueConnection);
        connect(viewModel, &LadderLineChartViewModel::endTimeChanged, this, &LadderLineChartView::updateChart, Qt::UniqueConnection);
        connect(viewModel, &LadderLineChartViewModel::ladderLinesChanged, this, &LadderLineChartView::updateChart, Qt::UniqueConnection);
    }

private slots:
    void updateChart() {
        // 1. 获取数据
        QList<LadderLineCarrier> dataPoints = viewModel->getLadderLines();

        // 2. 清空布局内旧的 widget，并断开信号
        QLayoutItem* item;
        while ((item = layout->takeAt(0)) != nullptr) {
            if (item->widget()) {
                // 断开信号连接
                PartsChartWidget* chartWidget = qobject_cast<PartsChartWidget*>(item->widget());
                if (chartWidget) {
                    // 从 chartsList 中移除并断开信号
                    chartsList.removeAll(chartWidget);
                }
                item->widget()->deleteLater();
            }
            delete item;
        }

        // 清空 chartsList
        chartsList.clear();

        // 3. 重新添加图表
        for (const LadderLineCarrier &data : dataPoints) {
            // qDebug() << "Series Name:" << data.seriesName << "Data Points Size:" << data.dataPoints.size();

            // 创建行布局
            QHBoxLayout *rowLayout = new QHBoxLayout();

            // 创建系列名称标签
            QLabel *seriesLabel = new QLabel(data.seriesName, this);
            rowLayout->addWidget(seriesLabel);

            // 创建 LadderLineWidget
            PartsLadderLineWidget *ladderLineWidget = new PartsLadderLineWidget(-1, 150, this);
            ladderLineWidget->setLadderLineData(data);
            rowLayout->addWidget(ladderLineWidget);

            // 设置布局比例
            rowLayout->setStretch(0, 0.5);  // 标签占比
            rowLayout->setStretch(1, 4);  // 图表占比

            // 将行布局包装到一个 QWidget 中
            QWidget *rowContainer = new QWidget;
            rowContainer->setLayout(rowLayout);

            // 添加到主布局（在弹簧项前）
            layout->addWidget(rowContainer);

            // 添加到 chartsList
            chartsList.append(ladderLineWidget);
        }

        // 添加弹簧项以保持布局顶部对齐
        layout->addStretch();

        // 4. 连接所有图表的信号与槽，实现同步
        for (int i = 0; i < chartsList.size(); ++i) {
            for (int j = i + 1; j < chartsList.size(); ++j) {
                PartsChartWidget* chartA = chartsList.at(i);
                PartsChartWidget* chartB = chartsList.at(j);

                // 连接 chartA 的 xAxisRangeChanged 到 chartB 的 setXAxisRangeFromSync
                connect(chartA, &PartsChartWidget::xAxisRangeChanged, chartB, &PartsChartWidget::setXAxisRangeFromSync, Qt::UniqueConnection);

                // 连接 chartB 的 xAxisRangeChanged 到 chartA 的 setXAxisRangeFromSync
                connect(chartB, &PartsChartWidget::xAxisRangeChanged, chartA, &PartsChartWidget::setXAxisRangeFromSync, Qt::UniqueConnection);
            }
        }
    }

private:
    LadderLineChartViewModel *viewModel;            // 视图模型
    QScrollArea *scrollArea;                        // 滚动区域
    QWidget *contentWidget;                          // 内容窗口
    QVBoxLayout *layout = nullptr;                  // 容器布局，用于放多个 PartsChartWidget
    QList<PartsChartWidget*> chartsList;             // 存储所有图表的列表
};

#endif // LADDERLINECHARTVIEW_HPP
